require('dotenv').config();
const express = require('express');
const path = require('path');
const fs = require('fs');
const cors = require('cors'); // 添加CORS中间件

// 创建Express应用
const app = express();

// 全局配置 - 模式设置
// 从环境变量读取初始地图模式，如果没有配置则默认为'offline'
app.locals.mapMode = process.env.MAP_INITIAL_MODE || 'offline';
console.log('初始地图模式设置为:', app.locals.mapMode);

// 初始化MBTiles服务（如果启用）
let mbtilesService = null;
if (process.env.USE_MBTILES === 'true') {
    try {
        const MBTilesService = require('./services/mbtilesService');
        mbtilesService = new MBTilesService();
        global.mbtilesService = mbtilesService;
        console.log('MBTiles服务已创建');
    } catch (error) {
        console.error('创建MBTiles服务失败:', error.message);
    }
}

// 配置静态文件目录和中间件
app.use(express.static(path.join(__dirname, 'public')));
// 映射maplibre-gl库文件到/libs/maplibre-gl路径，用于离线访问
app.use('/libs/maplibre-gl', express.static(path.join(__dirname, '../node_modules/maplibre-gl')));
app.use(express.json({ limit: '10mb' })); // 添加JSON解析中间件，用于处理POST请求的JSON数据
app.use(cors()); // 启用CORS支持，允许跨域请求

// 确保离线地图数据目录存在
const offlineMapDir = path.join(__dirname, '../offline-maps');
try {
    if (!fs.existsSync(offlineMapDir)) {
        fs.mkdirSync(offlineMapDir, { recursive: true });
    }
} catch (err) {
    console.error('创建离线地图目录失败:', err);
}

// 加载地图路由
const mapRoutes = require('./routes/mapRoutes');
app.use('/api/map', mapRoutes);

// 简单的地图样式API（保留这个接口，因为客户端可能还在使用）
app.get('/api/map/style', (req, res) => {
    console.log('===== 地图样式请求 =====');
    console.log('请求URL:', req.originalUrl);
    console.log('请求方法:', req.method);
    console.log('请求参数:', req.query);
    
    const mapType = req.query.type || 'vector';
    const apiKey = process.env.TIANDITU_API_KEY || ''; // 从环境变量读取API密钥而不是请求参数
    
    // 根据请求的地图类型动态生成正确的瓦片URL
    // 定义不同地图类型对应的路径和图层
    const mapTypeConfig = {
        vector: { path: 'vec_w', layer: 'vec' },
        terrain: { path: 'ter_w', layer: 'ter' },
        image: { path: 'img_w', layer: 'img' }
    };
    
    // 获取对应的配置，如果不存在则默认为矢量图
    const config = mapTypeConfig[mapType] || mapTypeConfig.vector;
    
    const style = {
        version: 8,
        sources: {
            'raster-tiles': {
                type: 'raster',
                tiles: [
                    `http://t0.tianditu.gov.cn/${config.path}/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=${config.layer}&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${apiKey}`,
                    `http://t1.tianditu.gov.cn/${config.path}/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=${config.layer}&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${apiKey}`,
                    `http://t2.tianditu.gov.cn/${config.path}/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=${config.layer}&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${apiKey}`,
                    `http://t3.tianditu.gov.cn/${config.path}/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=${config.layer}&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${apiKey}`
                ],
                tileSize: 256,
                minzoom: 1,
                maxzoom: 18
            }
        },
        layers: [
            {
                id: 'raster-layer',
                type: 'raster',
                source: 'raster-tiles'
            }
        ],
        // 正确配置glyphs和sprite
        sprite: '',
        glyphs: '/data/demotiles/font/{fontstack}/{range}.pbf'
    };
    
    // 打印生成的地图瓦片URL模板（隐藏API密钥的一部分）
    const maskedUrl = style.sources['raster-tiles'].tiles[0].replace(apiKey, apiKey ? apiKey.substring(0, 4) + '...' + apiKey.substring(apiKey.length - 4) : '');
    console.log('生成的地图瓦片URL模板:', maskedUrl);
    
    res.json(style);
});

// 主页面路由
app.get('/', (req, res) => {
    console.log('===== 主页面请求 =====');
    console.log('请求URL:', req.originalUrl);
    console.log('请求方法:', req.method);
    
    res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

app.get('/api/map/config', (req, res) => {
    console.log('===== 地图配置请求 =====');
    console.log('请求URL:', req.originalUrl);
    console.log('请求方法:', req.method);
    console.log('请求参数:', req.query);
    
    // 保持与客户端期望的字段名一致
    res.json({
        apiKey: process.env.TIANDITU_API_KEY || '', // 从.env中读取API密钥
        center: [116.397428, 39.90923], // 北京市中心坐标
        zoom: 10 // 默认缩放级别
    });
});
// 模式切换接口
app.post('/set-mode', (req, res) => {
    try {
        console.log('接收到模式切换请求:', req.body);
        const { mode } = req.body;
        
        if (!mode) {
            return res.status(400).json({ success: false, error: '缺少模式参数' });
        }
        
        if (mode === 'online' || mode === 'offline') {
            app.locals.mapMode = mode;
            console.log(`地图模式已切换为: ${mode}`);
            res.json({ success: true, mode: app.locals.mapMode });
        } else {
            res.status(400).json({ success: false, error: '无效的模式。支持的模式: online, offline' });
        }
    } catch (error) {
        console.error('处理模式切换请求时出错:', error);
        res.status(500).json({ success: false, error: '服务器内部错误' });
    }
});

// 获取当前模式接口
app.get('/get-mode', (req, res) => {
    try {
        console.log('接收到获取模式请求');
        const currentMode = app.locals.mapMode || 'offline';
        res.json({ mode: currentMode });
    } catch (error) {
        console.error('处理获取模式请求时出错:', error);
        res.status(500).json({ success: false, error: '服务器内部错误' });
    }
});

// 启动服务器
const PORT = process.env.PORT || 3000; // 从.env中读取端口号，默认3000
const HOST = process.env.HOST || '127.0.0.1'; // 从.env中读取主机地址，默认127.0.0.1

const server = app.listen(PORT, HOST, async () => {
    console.log(`服务器运行在 http://${HOST}:${PORT}`);
    console.log(`地图应用地址: http://${HOST}:${PORT}`);
    console.log(`当前地图模式: ${app.locals.mapMode}`);
    
    // 如果启用了MBTiles模式，初始化MBTiles服务
    if (process.env.USE_MBTILES === 'true' && mbtilesService) {
        const mbtilesDir = process.env.MBTILES_PATH || path.join(__dirname, '../mbtiles');
        try {
            await mbtilesService.init(mbtilesDir);
            console.log('MBTiles服务初始化完成');
            console.log('可用的瓦片类型:', mbtilesService.getAvailableTypes());
        } catch (error) {
            console.error('MBTiles服务初始化失败:', error.message);
        }
    }
});

// 优雅关闭处理
process.on('SIGTERM', () => {
    console.log('收到SIGTERM信号，正在关闭服务器...');
    // 关闭MBTiles服务
    if (mbtilesService) {
        mbtilesService.close();
    }
    if (server) {
        server.close(() => {
            console.log('服务器已关闭');
            process.exit(0);
        });
    } else {
        process.exit(0);
    }
});

module.exports = app;